/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hoja.de.trabajo.pkg6;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.PriorityQueue;
/**
 *
 * @author Pedro
 */

public class huffmanTree implements Comparable{
	
         
        BinaryTree  root; 
        int pesoTotal;
        ArrayList<decoder> decod= new ArrayList<decoder>();
        
         
        
        /**
         * Método que permite construir una hoja con caracter asignado.
         * @param hoja 
         */
        public huffmanTree(node1 hoja) {
            root = new BinaryTree(hoja);
            pesoTotal = hoja.frequency;
        }
        
        
        /**
         * Método que permite unir dos árboles en uno, actualizando también
         * el peso total de dicho árbol.
         * @param left
         * @param right 
         */
        public huffmanTree(huffmanTree left, huffmanTree right) {
            this.pesoTotal = left.pesoTotal + right.pesoTotal;
            root = new BinaryTree(null, left.root, right.root);
        }
        
        
        /**
         * Método que compara dos instancias de árboles.
         * @param o 
         * @return integer que representa la relación entre los valores 
         * asociados de los árboles
         */
        public int compareTo(Object o) {
            huffmanTree a = (huffmanTree)o;
            return this.pesoTotal - a.pesoTotal;
        }
        
        
        /**
         * Método que compara dos instancias de árboles.
         * @param a
         * @return true si las instancias de árboles son las mismas
         */
        public boolean equals(Object a) {
            return this == a;
        }
        
        
        /**
         * Método que imprime los Strings asociados de los caracteres del árbol. 
         */
        public void print() {
            print(this.root, "");
        }
        
        
        /**
         * Método que imprime los Strings asociados de los caracteres del 
         * árbol indicado. 
         * @param root
         * @param codigo 
         */
        protected void print(BinaryTree root, String codigo) {
            if (root.getLeft()!= null) {
                print(root.getLeft(), codigo+"0");
                print(root.getRight(), codigo+"1");
               
            } else {
                node1 e = (node1)root.getValue();
                System.out.println("  Codigo del caracter " + e.ch + " es: " + codigo + "      Frecuencia: " + e.frequency );
                decoder temp= new decoder(e.ch,codigo);
                decod.add(temp);
            }
        }   
        
}
